/* 
 * File:   RepoItem.h
 * Author: gabilan
 *
 * Created on 26 de mayo de 2013, 20:11
 */
#include <string>
#include <vector>
#include <stdint.h>
#include "common_ISerializable.h"
#include "common_tinyxml.h"
#include "common_Mutex.h"

using namespace std;
using namespace TP;

#ifndef REPOITEM_H
#define	REPOITEM_H

#define SEPARADOR_NODO "/";

#define ESTADO_INDEFINIDO 0

namespace TP { namespace Archivos {


enum estado_archivo_t {
    ARCHIVO_INDEF = 0
  , ARCHIVO_DETECTADO = 1
  , ARCHIVO_BORRADO = 2
  , ARCHIVO_MODIFICADO = 3
  , ARCHIVO_SINCRONIZADO = 4
  , ARCHIVO_DECLARADO = 5
  , ARCHIVO_CARGANDO = 6
  , ARCHIVO_CARGADO = 7
  , ARCHIVO_A_PUBLICAR = 8
  , ARCHIVO_EN_CONFLICTO = 9
  , ARCHIVO_A_DESCARGAR = 10
  , ARCHIVO_DESCARGADO = 11
  , ARCHIVO_A_ACTUALIZAR = 12
  // , ARCHIVO_A_BORRAR = 13
  , ARCHIVO_A_ELIMINAR_EN_CLIENTE = 14
  , ARCHIVO_A_ELIMINAR_EN_SERVIDOR = 15
  , ARCHIVO_ELIMINADO_EN_SERVIDOR = 16
  , INDEFINIDO = 17
  , ARCHIVO_A_ELIMINANDO_EN_SERVIDOR = 17
};

class RepoItem : public ISerializable {

public:
    
    RepoItem();
    
    virtual ~RepoItem();
    
    std::string GetFilename() const;
    
    std::string GetFilePath() const;
    
    string GetHash(const size_t &pIndice) const;
    
    void SetFilename(const string & s);
    
    void SetFilePath(const string & s);

    uint32_t GetVersion ();
    
    uint32_t SetVersion (const uint32_t &pValor);

    void AddHash(const string &s);
    
    void ActualizarHash(int32_t numeroChunk, const string &s);
    
    void LimpiarHashes ();
    
    string GetRutaCompletaArchivo ();
    
    size_t GetCantidadHashes();
    
    string Serializar ();
        
    TiXmlNode* ToXml();
    
    estado_archivo_t  GetEstado();
    
    estado_archivo_t  SetEstado (estado_archivo_t pValor);
    
    RepoItem* Clonar();

    static RepoItem* Parse (const string& pXml);
    
    static RepoItem* Parse (TiXmlNode* xmlNode);
    
private:
    
    RepoItem & operator = (const RepoItem&);
    
    uint32_t _version;
    
    estado_archivo_t _estado;
    Mutex _estadoMutex;
    
    std::string _filename;
    std::string _filepath;
    vector<std::string> _hashes;
        
    // Constantes de serializacion 
    static std::string _rootNodeName;
    static std::string _versionNodeName;
    static std::string _filenameNodeName;
    static std::string _filepathNodeName;
    static std::string _listOfHashesNodeName;
    static std::string _hashesNodeName;
    static std::string _estadoNodeName;
};

}}

#endif	/* REPOITEM_H */

